//package com.popay.swagger;
//
//
//import com.github.xiaoymin.knife4j.spring.annotations.EnableKnife4j;
//import io.swagger.annotations.Api;
//import io.swagger.models.auth.In;
//import org.apache.commons.lang3.reflect.FieldUtils;
//import org.springframework.beans.factory.annotation.Value;
//import org.springframework.boot.SpringBootVersion;
//import org.springframework.context.annotation.Bean;
//import org.springframework.context.annotation.Configuration;
//import org.springframework.context.annotation.Import;
//import org.springframework.util.ReflectionUtils;
//import org.springframework.web.bind.annotation.RestController;
//import org.springframework.web.servlet.config.annotation.InterceptorRegistration;
//import org.springframework.web.servlet.config.annotation.InterceptorRegistry;
//import springfox.bean.validators.configuration.BeanValidatorPluginsConfiguration;
//import springfox.documentation.builders.*;
//import springfox.documentation.schema.ModelRef;
//import springfox.documentation.service.*;
//import springfox.documentation.spi.DocumentationType;
//import springfox.documentation.spi.service.contexts.SecurityContext;
//import springfox.documentation.spring.web.plugins.Docket;
//import springfox.documentation.swagger2.annotations.EnableSwagger2;
//
//import java.lang.reflect.Field;
//import java.util.*;
//
//@EnableSwagger2
//@EnableKnife4j
//@Configuration
//@Import(BeanValidatorPluginsConfiguration.class)
//public class SwaggerConfig {
//    @Value("${springfox.title}")
//    private String title;
//    @Value("${springfox.desc}")
//    private String desc;
//    @Value("${springfox.termsOfServiceUrl}")
//    private String termsOfServiceUrl;
//    @Value("${springfox.groupName}")
//    private String groupName;
//    @Value("${springfox.basePackage}")
//    private String basePackage;
//    @Value("${springfox.contactName}")
//    private String contactName;
//    @Value("${springfox.contactUrl}")
//    private String contactUrl;
//    @Value("${springfox.contactEmail}")
//    private String contactEmail;
//
//    @Bean
//    public Docket createRestApi() {
//        //return new Docket(DocumentationType.OAS_30).pathMapping("/")
//        return new Docket(DocumentationType.SWAGGER_2).pathMapping("/")
//                // 定义是否开启swagger，false为关闭，可以通过变量控制
//                //.enable(swaggerProperties.getEnable())
//                // 将api的元信息设置为包含在json ResourceListing响应中。
//                .apiInfo(apiInfo())
//                .groupName("默认API示例分组")
//                // 接口调试地址
//                //.host(swaggerProperties.getTryHost())
//                // 选择哪些接口作为swagger的doc发布
//                .select()
//                .apis(RequestHandlerSelectors.any())
//                //按指定注解匹配
//                .apis(RequestHandlerSelectors.withClassAnnotation(RestController.class))
//                //按路径匹配
//                //.apis(RequestHandlerSelectors.basePackage("com.ym.controller"))
//                .apis(RequestHandlerSelectors.withClassAnnotation(Api.class))
//                .paths(PathSelectors.any())
//                .build()
//                .globalOperationParameters(globalOperation())
//                // 支持的通讯协议集合
//                .protocols(newHashSet("https", "http"))
//                // 授权信息设置，必要的header token等认证信息
//                .securitySchemes(securitySchemes())
//                // 授权信息全局应用
//                .securityContexts(securityContexts());
//    }
//
//    @Bean
//    public Docket innerApi() {
//        return new Docket(DocumentationType.SWAGGER_2).pathMapping("/")
//                // 定义是否开启swagger，false为关闭，可以通过变量控制
//                //.enable(swaggerProperties.getEnable())
//                // 将api的元信息设置为包含在json ResourceListing响应中。
//                .apiInfo(customApiInfo())
//                .groupName(groupName)
//                // 接口调试地址
//                //.host(swaggerProperties.getTryHost())
//                // 选择哪些接口作为swagger的doc发布
//                .select()
//                .apis(RequestHandlerSelectors.any())
//                //按指定注解匹配
//                //.apis(RequestHandlerSelectors.withClassAnnotation(RestController.class))
//                //按路径匹配
//                .apis(RequestHandlerSelectors.basePackage(basePackage))
//                .apis(RequestHandlerSelectors.withClassAnnotation(Api.class))
//                .paths(PathSelectors.any())
//                .build()
//                .globalOperationParameters(globalOperation())
//                // 支持的通讯协议集合
//                .protocols(newHashSet("https", "http"))
//                // 授权信息设置，必要的header token等认证信息
//                .securitySchemes(securitySchemes())
//                // 授权信息全局应用
//                .securityContexts(securityContexts());
//    }
//
//    /**
//     * API 页面上半部分展示信息
//     */
//    private ApiInfo apiInfo() {
//        return new ApiInfoBuilder().title("Knife4j-Swagger接口文档 Api Doc")
//                .description("SpringCloud-Alibaba")
//                .termsOfServiceUrl(termsOfServiceUrl)
//                .contact(new Contact(contactName, contactUrl, contactEmail))
//                .version("Spring Boot Version: " + SpringBootVersion.getVersion())
//                .build();
//    }
//
//    private ApiInfo customApiInfo() {
//        return new ApiInfoBuilder().title(title).description(desc)
//                .termsOfServiceUrl(termsOfServiceUrl)
//                .contact(new Contact(contactName, contactUrl, contactEmail))
//                .version("Spring Boot Version: " + SpringBootVersion.getVersion())
//                .build();
//    }
//
//    /**
//     * 设置授权信息
//     */
//    private List<SecurityScheme> securitySchemes() {
//        ApiKey apiKey = new ApiKey("Authorization","Authorization" , In.HEADER.toValue());
//        return Collections.singletonList(apiKey);
//    }
//
//    /**
//     * 授权信息全局应用
//     */
//    private List<SecurityContext> securityContexts() {
//        return Collections.singletonList(
//                SecurityContext.builder()
//                        .securityReferences(Collections.singletonList(new SecurityReference("Authorization", new AuthorizationScope[]{new AuthorizationScope("global", "")})))
//                        .build()
//        );
//    }
//
//    @SafeVarargs
//    private final <T> Set<T> newHashSet(T... ts) {
//        if (ts.length > 0) {
//            return new LinkedHashSet<>(Arrays.asList(ts));
//        }
//        return null;
//    }
//
//    /**
//     * 通用拦截器排除swagger设置，所有拦截器都会自动加swagger相关的资源排除信息
//     */
//    @SuppressWarnings("unchecked")
//    public void addInterceptors(InterceptorRegistry registry) {
//        try {
//            Field registrationsField = FieldUtils.getField(InterceptorRegistry.class, "registrations", true);
//            List<InterceptorRegistration> registrations = (List<InterceptorRegistration>) ReflectionUtils.getField(registrationsField, registry);
//            if (registrations != null) {
//                for (InterceptorRegistration interceptorRegistration : registrations) {
//                    interceptorRegistration
//                            .excludePathPatterns("/swagger**/**")
//                            .excludePathPatterns("/webjars/**")
//                            .excludePathPatterns("/v3/**")
//                            .excludePathPatterns("/doc.html");
//                }
//            }
//        } catch (Exception e) {
//            e.printStackTrace();
//        }
//    }
//
//    private List<Parameter> globalOperation(){
//        //添加head参数配置start
//        ParameterBuilder tokenPar = new ParameterBuilder();
//        List<Parameter> pars = new ArrayList<>();
//        //第一个token为传参的key，第二个token为swagger页面显示的值
//        tokenPar.name("Authorization").description("token值").modelRef(new ModelRef("string")).parameterType("header").required(false).build();
//        pars.add(tokenPar.build());
//        return pars;
//    }
//
//    private List<ResponseMessage> customerResponseMessage() {
//        List<ResponseMessage> list = new ArrayList<>();
//        list.add(new ResponseMessageBuilder().code(200).message("请求成功").build());
//        list.add(new ResponseMessageBuilder().code(201).message("资源创建成功").build());
//        list.add(new ResponseMessageBuilder().code(204).message("服务器成功处理了请求，但不需要返回任何实体内容").build());
//        list.add(new ResponseMessageBuilder().code(400).message("请求失败,具体查看返回业务状态码与对应消息").build());
//        list.add(new ResponseMessageBuilder().code(401).message("请求失败,未经过身份认证").build());
//        list.add(new ResponseMessageBuilder().code(405).message("请求方法不支持").build());
//        list.add(new ResponseMessageBuilder().code(415).message("请求媒体类型不支持").build());
//        list.add(new ResponseMessageBuilder().code(500).message("服务器系统异常").build());
//        list.add(new ResponseMessageBuilder().code(503).message("服务器系统超载当前无法处理请求,并且将在一段时间以后恢复").build());
//        return list;
//    }
//}
